package br.com.foxinline.manager.acao;

import br.com.foxinline.enums.StatusProtocolo;
import br.com.foxinline.enums.TipoPessoa;
import br.com.foxinline.modelo.Livro;
import br.com.foxinline.modelo.Pessoa;
import br.com.foxinline.modelo.Protocolo;
import br.com.foxinline.modelo.ProtocoloItem;
import br.com.foxinline.modelo.Selo;
import br.com.foxinline.modelo.TipoSelo;
import br.com.foxinline.servico.LivroServico;
import br.com.foxinline.servico.ProtocoloServico;
import br.com.foxinline.servico.SeloServico;
import br.com.foxinline.servico.TipoSeloServico;
import br.com.foxinline.utilitario.Caracteres;
import br.com.foxinline.utilitario.Mensagem;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author cadomeireles
 */
@ViewScoped
@ManagedBean
public class ManagerSelarProtocolo implements Serializable {

    @EJB
    ProtocoloServico protocoloServico;
    @EJB
    LivroServico livroServico;
    @EJB
    SeloServico seloServico;
    @EJB
    TipoSeloServico tipoSeloServico;
    private Protocolo protocolo;
    private List<ProtocoloItem> protocoloItens;
    private List<ProtocoloItem> protocoloItensSelados;
    private ProtocoloItem protocoloItem;
    private List<Selo> selosSugeridos;
    private List<Selo> selosSelecionados;
    private List<Selo> selos;
    private List<Selo> selosTemporariamenteProtolados;
    private Livro livro;
    private String folhas;
    private String protocoloId;
    private Selo selo;

    @PostConstruct
    public void init() {
        instanciar();
    }

    private void instanciar() {
        Map<String, String> parametros = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.protocoloId = parametros.get("protocoloId");

        this.protocolo = new Protocolo();
        this.protocolo = protocoloServico.pesquisar(Long.parseLong(this.protocoloId));
        this.protocolo.setProtocoloItems(protocoloServico.obterItens(this.protocolo));
        this.protocoloItens = this.protocolo.getProtocoloItems();

        this.selo = new Selo();

        this.selosTemporariamenteProtolados = new ArrayList<Selo>();

        instanciarItem();

        this.protocoloItensSelados = new ArrayList<ProtocoloItem>();
    }

    private void instanciarItem() {
        this.selosSugeridos = new ArrayList<Selo>();
        this.selosSelecionados = new ArrayList<Selo>();
        this.selos = new ArrayList<Selo>();

        this.livro = new Livro();
        this.folhas = new String();

        this.protocoloItem = new ProtocoloItem();
    }

    public void sugirirSelos() {

        this.selosSugeridos = new ArrayList<Selo>();

        Selo selo = protocoloServico.sugerirSelo(this.protocoloItem.getAtoItem().getTipoSelo(), this.selosTemporariamenteProtolados);
        if (selo.getId() != null) {
            this.selosSugeridos.add(selo);
        } else {
            Mensagem.messagemWarn("Não há nenhum selo do tipo " + this.protocoloItem.getAtoItem().getTipoSelo().getNome() + " disponível.");
        }

        if (this.protocoloItem.getAtoItem().isArquivamento()) {
            selo = protocoloServico.sugerirSeloArquivamento(this.selosTemporariamenteProtolados);
            if (selo.getId() != null) {
                this.selosSugeridos.add(selo);
            } else {
                Mensagem.messagemWarn("Não há nenhum selo de Arquivamento disponível.");
            }
        }

        if (this.protocoloItem.getAtoItem().isGratuidade()) {
            selo = protocoloServico.sugerirSeloGratuidade(this.selosTemporariamenteProtolados);
            if (selo.getId() != null) {
                this.selosSugeridos.add(selo);
            } else {
                Mensagem.messagemWarn("Não há nenhum selo de Gratuidade disponível.");
            }
        }

    }

    public void adicionarSelo() {

        Selo seloReal = seloServico.obterSelo(this.selo);

        if (seloReal.getId() != null) {
            this.selosTemporariamenteProtolados.add(seloReal);
            this.selos.add(seloReal);
            this.selo = new Selo();
        } else {
            Mensagem.messagemWarn("Selo indisponível.");
        }

    }

    public void adicionarSelosSugerido() {
        this.selosTemporariamenteProtolados.addAll(this.selosSelecionados);
        this.protocoloItem.setSelos(this.selosSelecionados);
    }

    public void adicionarSelosSelecionados() {
        this.protocoloItem.setSelos(this.selos);
    }

    public void adicionarServico() {
        adicionarSelosSugerido();
        adicionarSelosSelecionados();

        this.protocoloItem.setFolhas(this.folhas);
        this.protocoloItem.setLivro(this.livro);

        this.protocoloItensSelados.add(this.protocoloItem);
        this.protocoloItens.remove(this.protocoloItem);

        instanciarItem();
    }

    public void salvar() {

        for (ProtocoloItem item : this.protocoloItensSelados) {
            for (Selo selo : item.getSelos()) {
                selo.setProtocolo(this.protocolo);
                selo.setProtocolado(true);
            }
            item.setSelado(true);
        }

        this.protocoloItens.addAll(this.protocoloItensSelados);

        this.protocolo.setDataConversao(new Date());

        this.protocolo.setStatusProtocolo(StatusProtocolo.PRATICADO);

        protocoloServico.atualizar(this.protocolo);

        instanciarItem();

        this.protocoloItensSelados = new ArrayList<ProtocoloItem>();

        Mensagem.messagemInfo("Protocolo selado com sucesso!");

    }

    public String obterInteressado() {
        Pessoa pessoa = this.protocolo.getCliente();

        if (pessoa.getTipoPessoa() != null) {
            if (pessoa.getTipoPessoa() == TipoPessoa.FISICA) {
                return pessoa.getNome() + ", CPF " + adicionarMascaraCPF(pessoa.getCpf());
            } else {
                return pessoa.getRazaoSocial() + ", CNPJ " + adicionarMascaraCNPJ(pessoa.getCnpj());
            }
        } else {
            return "";
        }

    }

    public List<TipoSelo> autocompletarTipoSelo(String query) {
        return tipoSeloServico.autocompletar(query);
    }

    public String adicionarMascaraCNPJ(String string) {
        return Caracteres.adicionarMascara(string, Caracteres.cnpjMask);
    }

    public String adicionarMascaraCPF(String string) {
        return Caracteres.adicionarMascara(string, Caracteres.cpfMask);
    }

    public List<Livro> autocompletarLivro(String query) {
        return livroServico.autocompletar(query);
    }

    public Protocolo getProtocolo() {
        return protocolo;
    }

    public void setProtocolo(Protocolo protocolo) {
        this.protocolo = protocolo;
    }

    public List<ProtocoloItem> getProtocoloItens() {
        return protocoloItens;
    }

    public void setProtocoloItens(List<ProtocoloItem> protocoloItens) {
        this.protocoloItens = protocoloItens;
    }

    public ProtocoloItem getProtocoloItem() {
        return protocoloItem;
    }

    public void setProtocoloItem(ProtocoloItem protocoloItem) {
        this.protocoloItem = protocoloItem;
    }

    public List<Selo> getSelosSugeridos() {
        return selosSugeridos;
    }

    public void setSelosSugeridos(List<Selo> selosSugeridos) {
        this.selosSugeridos = selosSugeridos;
    }

    public List<Selo> getSelosSelecionados() {
        return selosSelecionados;
    }

    public void setSelosSelecionados(List<Selo> selosSelecionados) {
        this.selosSelecionados = selosSelecionados;
    }

    public Livro getLivro() {
        return livro;
    }

    public void setLivro(Livro livro) {
        this.livro = livro;
    }

    public String getFolhas() {
        return folhas;
    }

    public void setFolhas(String folhas) {
        this.folhas = folhas;
    }

    public List<ProtocoloItem> getProtocoloItensSelados() {
        return protocoloItensSelados;
    }

    public void setProtocoloItensSelados(List<ProtocoloItem> protocoloItensSelados) {
        this.protocoloItensSelados = protocoloItensSelados;
    }

    public Selo getSelo() {
        return selo;
    }

    public void setSelo(Selo selo) {
        this.selo = selo;
    }

    public List<Selo> getSelos() {
        return selos;
    }

    public void setSelos(List<Selo> selos) {
        this.selos = selos;
    }
}
